#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;
//每隔一秒完成一些任务
void handlerSig(int sig)
{
    std::cout << "receive signal " << sig <<"pid"<<getpid()<< std::endl;
    int n=alarm(1);//设定闹钟为1秒
    cout<<n<<endl;//n的返回值是0就表示上一个闹钟结束了
}
void PrintPending(sigset_t &pending)
{
    for(int signo=31;signo<=1;signo--)//信号从1开始，最大即是31.，我们种类是倒序的，先检查高位的
    {
        if(sigismember(&pending,signo))//判断指定的信号signo是否在pending集合中
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
        cout<<endl;
    }
}
int main()
{
    //1.屏蔽2号信号
    sigset_t block,oblock;//存储信号集
    sigemptyset(&block);//初始化一个信号集
    sigemptyset(&oblock);//记录旧的表
    sigaddset(&block,2);//将2号信号加入到信号集中
    //将用户空间的位图结构设置到调用进程的block表中
    int n=sigprocmask(SIG_SETMASK,&block,NULL);//屏蔽2号信号
    //该函数用于检查或修改（或同时进行）调用进程的信号掩码（即当前被阻塞的信号集）
    (void)n;//使用下n

    int cnt=0;
    //4.重复获取打印过程
    while(true)
    {
        // 2.获取pending信号集合
        sigset_t pending;             // 存储pending信号集合
        int m = sigpending(&pending); // 获取pending信号集合

        // 3.打印
        PrintPending(pending);
        if(cnt==10)
        {
            //恢复对2号信号的屏蔽
            cout<<"解除对2号的屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oblock,NULL);//恢复原来的信号掩码
        }

        sleep(1);
        cnt++;
    }
    return 0;
}




// int main()
// { 
//     signal(SIGINT,handlerSig);
//     alarm(1);//设定闹钟为1秒
//     while(true)
//     {
        
//         pause();//暂停功能
//     }
//     return 0;
// }



// int main()
// { 
//     signal(SIGINT,handlerSig);
//     alarm(1);//设定闹钟为1秒
//     while(true)
//     {
//         //想让进程什么都不做，让进程暂停
//         //一但来一个信号，就唤醒一次执行方法

//         cout<<".,"<<"pid"<<getpid()<<endl;
//         // sleep(1);
//         pause();//暂停功能
//     }
//     return 0;
// }






// int main()
// {
//     signal(SIGINT,handlerSig);//当我们收到了2号终止信号SIGINT时,系统会直接调用handlerSig函数
//     // for(int i=0;i<32;i++)//每隔一秒自己给自己发送一个信号
//     // {
//     //     sleep(1);
//     //     if(i==9||i==19)continue;//跳过第9个信号
//     //     raise(i);
//     // }


//     int cnt=0;
//     while (true)
//     {
//         cout<<cnt++<<endl;
//         abort();
//         sleep(1);
//     }
    
//     return 0;
// }